package com.lecture.java8.lambda;

import java.util.Comparator;
import java.util.function.Consumer;

/**
 * @program: spring-lecture
 * @description: 一：lambda表达式的基础语法：Java8引入了一个新的操作符“->”该操作符称为箭头操作符或者lambda操作符
 *                     箭头操作符把lambda表达式拆分为两部分
 *                     左侧：lambda表达式的参数列表
 *                     右侧：lambda表达式中所需要执行的功能，即lambda表达式
 *
 *                     语法一：无参数 无返回值
 *                              () -> System.out.println("hello word");
 *                     语法二：有一个参数，并且无返回值
 *                              (item) -> {System.out.println("")};
 *                     语法三：有多个参数 有返回值 并且lambda体中有多条语句
 *                        Comparator<Integer> com  = (o1, o2) -> {
 *                           System.out.println("这是函数式接口");
 *                           return Integer.compare(o1, o2);
 *                        };
 *                      语法四：若lambda体中只有一条语句，return和大括号可以省略不写
 *                                 Comparator<Integer> com2 = (o1, o2) -> Integer.compare(o1, o2);
 *
 *                  二：lambda表达式需要函数式接口的支持
 *                      函数接口：j接口中只有一个抽象方法时，成为函数是接口（也可以使用@FunctionalInterface修饰）
 *                      //@FunctionalInterface修饰可以检查接口是不是函数式接口
 *
 * @author: luyn
 * @create: 2020-03-26 17:22
 **/
public class TestLambda {
    public static void main(String[] args) {
        System.out.println("语法一：-----------------");
        Runnable runnable = new Runnable() {
            @Override
            public void run() {
                System.out.println("hello word");
            }
        };
        System.out.println("--------------------------");
        Runnable runnable1 = () -> {
            System.out.println("hello lambda");
        };
        runnable.run();
        runnable1.run();    

        System.out.println("语法二：--------------");
        Consumer<String> consumer = System.out::println;
        consumer.accept("输出");

        System.out.println("方法三：------------------");
        Comparator<Integer> com  = (o1, o2) -> {
            System.out.println("这是函数式接口");
            return Integer.compare(o1, o2);
        };
        Comparator<Integer> com2 = (o1, o2) -> Integer.compare(o1, o2);

        System.out.println("lambda使用");
        TestLambda testLambda = new TestLambda();
        int i = testLambda.operation(32, (num) -> num + 123);
        System.out.println(i);
    }

    public Integer operation(Integer num, MyFun myFun) {
        return myFun.getValue(num);
    }
}
